// Tencent is pleased to support the open source community by making RapidJSON
// available.
//
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All
// rights reserved.
//
// Licensed under the MIT License (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of the License
// at
//
// http://opensource.org/licenses/MIT
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

#ifndef RAPIDJSON_ERROR_EN_H_
#define RAPIDJSON_ERROR_EN_H_

#include "error.h"

#ifdef __clang__
RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF(switch - enum)
RAPIDJSON_DIAG_OFF(covered - switch - default)
#endif

RAPIDJSON_NAMESPACE_BEGIN

//! Maps error code of parsing into error message.
/*!
    \ingroup RAPIDJSON_ERRORS
    \param parseErrorCode Error code obtained in parsing.
    \return the error message.
    \note User can make a copy of this function for localization.
        Using switch-case is safer for future modification of error codes.
*/
inline const RAPIDJSON_ERROR_CHARTYPE* GetParseError_En(
    ParseErrorCode parseErrorCode) {
  switch (parseErrorCode) {
    case kParseErrorNone:
      return RAPIDJSON_ERROR_STRING("No error.");

    case kParseErrorDocumentEmpty:
      return RAPIDJSON_ERROR_STRING("The document is empty.");
    case kParseErrorDocumentRootNotSingular:
      return RAPIDJSON_ERROR_STRING(
          "The document root must not be followed by other values.");

    case kParseErrorValueInvalid:
      return RAPIDJSON_ERROR_STRING("Invalid value.");

    case kParseErrorObjectMissName:
      return RAPIDJSON_ERROR_STRING("Missing a name for object member.");
    case kParseErrorObjectMissColon:
      return RAPIDJSON_ERROR_STRING(
          "Missing a colon after a name of object member.");
    case kParseErrorObjectMissCommaOrCurlyBracket:
      return RAPIDJSON_ERROR_STRING(
          "Missing a comma or '}' after an object member.");

    case kParseErrorArrayMissCommaOrSquareBracket:
      return RAPIDJSON_ERROR_STRING(
          "Missing a comma or ']' after an array element.");

    case kParseErrorStringUnicodeEscapeInvalidHex:
      return RAPIDJSON_ERROR_STRING(
          "Incorrect hex digit after \\u escape in string.");
    case kParseErrorStringUnicodeSurrogateInvalid:
      return RAPIDJSON_ERROR_STRING("The surrogate pair in string is invalid.");
    case kParseErrorStringEscapeInvalid:
      return RAPIDJSON_ERROR_STRING("Invalid escape character in string.");
    case kParseErrorStringMissQuotationMark:
      return RAPIDJSON_ERROR_STRING(
          "Missing a closing quotation mark in string.");
    case kParseErrorStringInvalidEncoding:
      return RAPIDJSON_ERROR_STRING("Invalid encoding in string.");

    case kParseErrorNumberTooBig:
      return RAPIDJSON_ERROR_STRING("Number too big to be stored in double.");
    case kParseErrorNumberMissFraction:
      return RAPIDJSON_ERROR_STRING("Miss fraction part in number.");
    case kParseErrorNumberMissExponent:
      return RAPIDJSON_ERROR_STRING("Miss exponent in number.");

    case kParseErrorTermination:
      return RAPIDJSON_ERROR_STRING("Terminate parsing due to Handler error.");
    case kParseErrorUnspecificSyntaxError:
      return RAPIDJSON_ERROR_STRING("Unspecific syntax error.");

    default:
      return RAPIDJSON_ERROR_STRING("Unknown error.");
  }
}

RAPIDJSON_NAMESPACE_END

#ifdef __clang__
RAPIDJSON_DIAG_POP
#endif

#endif  // RAPIDJSON_ERROR_EN_H_
